# -*- coding: utf-8 -*-
# time: 2025/4/19 10:08
# file: functools_ts.py
# author: hanson

import time
from functools import wraps

"""
装饰器本质是接受函数作为参数的高阶函数，通过闭包特性实现功能扩展，使用@decorator语法糖简化调用
使用场景
● 日志记录（记录函数调用信息）
● 性能监控（统计函数执行时间）
● 权限校验（拦截未授权访问）
● 缓存加速（Memoization模式）
"""
# 函数运行时间计时器
def timing_decorator(func):
    '''
    @wraps(func) 是 Python 中 functools 模块提供的一个装饰器，
    用于在定义自定义装饰器时，保留被装饰函数的元信息（如函数名、文档字符串、参数列表等）。
    如果不使用 @wraps(func)，被装饰函数的元信息会被装饰器函数的元信息所覆盖。
    '''
    @wraps(func)  # 保留原函数元信息
    def wrapper2(*args, **kwargs):
        start = time.perf_counter()  # 返回一个高精度的计时器，用于测量短时间的代码执行
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__}执行耗时: {end - start:.10f}s")
        return result
    return wrapper2

@timing_decorator
def factorial(n):
    print(n)
    return 1 if n <= 1 else n * factorial(n-1)

# 测试输出
print(factorial(5))  # 输出执行时间及结果